4-2. 컨테이너를 다루는 도구, 도커(Docker) - 파트 2
4.7. 컨테이너와 프로세스: 프로세스별로 컨테이너 나누기
4.7.1. 하나의 컨테이너에 하나의 프로세스가 기준
컨테이너는 본질적으로 프로세스와 동일함. 따라서 여러 응용 프로그램을 같은 컨테이너에 넣을지는 **"이들을 일반적으로 같은 프로세스로 실행하는가"를 기준으로 판단할 수 있음.
예를 들어 웹 시스템을 웹 서버 / AP 서버 / DB 서버의 3계층으로 구성한다고 하면, 한 컨테이너 안에서 세 프로세스를 모두 실행할 수도 있지만 일반적으로 세 서버는 별도 프로세스로 실행함. 따라서 프로세스마다 3개의 컨테이너로 나누는 것이 바람직함.
3계층 웹 시스템의 컨테이너 분리:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[한 컨테이너에 몰아넣기] [프로세스별로 분리 — 권장]
┌────────────────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│ 웹 + AP + DB │ │ 웹 서버 │ │ AP 서버 │ │ DB 서버 │
│ (3개 프로세스) │ │ 컨테이너 │ │ 컨테이너 │ │ 컨테이너 │
└────────────────────┘ └────────┘ └────────┘ └────────┘
✗ 병목 시 개별 확장 불가 ✓ 병목 컨테이너만 여러 대로 확장
✗ 공유 리소스 경합 위험 ✓ 프로세스 격리로 경합 방지
4.7.2. 프로세스별로 컨테이너를 나눌 때 장점
- 부하 분산이 쉬움: 일부 컨테이너가 병목이 되어 시스템 전체 처리 능력이 저하될 때, 병목이 발생한 컨테이너만 여러 대 기동해 부하를 분산하고 처리 능력을 개선할 수 있음
- 성능 저하가 거의 없음: 컨테이너는 프로세스 실행에 필요한 오버헤드가 거의 없어 프로세스별로 잘게 나누어도 성능 손실이 미미함
- 반면 가상 서버는 프로세스 실행 오버헤드가 크므로, 프로세스별로 나누면 성능이 크게 저하될 수 있음 → 하나의 가상 서버에 모아서 구성하는 편이 나을 수 있음
- 경합 상태 방지: 여러 프로세스가 같은 파일 등 공유 리소스에 동시에 접근할 때 발생하는 경합 상태, 또는 그로 인한 버그를 예방할 수 있음
- 경합 상태 (Race Condition): 여러 프로세스·스레드가 공유 리소스에 동시에 접근할 때 실행 순서에 따라 결과가 달라지는 상태. 재현이 어려운 버그의 원인
4.7.3. 프로세스별로 컨테이너를 나눌 때 단점
- 관리가 복잡해짐: 하나의 시스템을 실행하기 위해 여러 컨테이너를 함께 실행·관리해야 함. 컨테이너가 많을수록 문제가 심각해짐 → 컨테이너 오케스트레이션으로 완화
- 리소스 공유를 전제로 설계된 소프트웨어와의 충돌: 소프트웨어 자체가 다른 소프트웨어와 동일한 리소스를 공유한다는 전제로 설계된 경우, 프로세스별로 분리하면 문제가 생길 수 있음. 이때는 하나의 컨테이너 안에 여러 프로세스를 실행하는 편이 나을 수 있음 (도커에 국한된 현상은 아님)
4.7.4. 볼륨이란
컨테이너를 삭제하면 컨테이너의 데이터도 사라짐. 데이터를 남겨 두고 싶으면 **도커 볼륨(Volume)을 사용해야 함.
- 볼륨: 컨테이너가 읽고 쓰는 데이터를 **지속화(Persistence)하기 위한 방법
- 지속화 = 프로그램이 종료되더라도 데이터가 손실되지 않도록 저장하는 것
- 볼륨은 도커가 관리하는 디렉터리이며 이름으로 관리함
- 동일한 볼륨을 여러 컨테이너의 파일 시스템에 동시에 마운트할 수 있음
- 같은 데이터베이스를 사용하는 응용 프로그램처럼 여러 프로세스가 파일 시스템을 공유해야 할 때, 볼륨으로 공유하면 각 프로세스를 개별 컨테이너로 나눌 수 있음
바인드 마운트(Bind Mount)는 볼륨과 비슷하지만 호스트 운영 체제의 파일 시스템을 컨테이너에 마운트한다는 점이 다름. 파일 시스템 공유는 가능하나 제약이 많으므로, 컨테이너 간 공유에는 볼륨이 더 나음. 바인드 마운트는 주로 호스트와 컨테이너 간 파일 시스템 공유에 사용함.
- 볼륨 (Volume): 컨테이너가 읽고 쓰는 데이터를 지속화하기 위해 도커가 관리하는, 이름이 붙은 디렉터리
- 지속화 (Persistence): 프로그램이 종료되어도 데이터가 손실되지 않도록 저장하는 것
- 바인드 마운트 (Bind Mount): 호스트 OS의 특정 경로를 컨테이너에 직접 마운트하는 방식
볼륨 vs 바인드 마운트:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[도커 볼륨] [바인드 마운트]
┌───────────┐ ┌───────────┐ ┌───────────┐
│ 컨테이너 A │ │ 컨테이너 B │ │ 컨테이너 │
└─────┬─────┘ └─────┬─────┘ └─────┬─────┘
└──────┬───────┘ │
▼ ▼
┌────────────────────┐ ┌────────────────────┐
│ 도커가 관리하는 │ │ 호스트 OS의 임의 │
│ 전용 디렉터리(이름) │ │ 경로(파일/디렉터리) │
└────────────────────┘ └────────────────────┘
→ 컨테이너 간 공유에 적합 → 호스트 ↔ 컨테이너 공유에 사용
→ 제약이 적음 → 제약이 많음
| 구분 | 도커 볼륨 (Volume) | 바인드 마운트 (Bind Mount) |
|---|---|---|
| 저장 위치 | 도커가 관리하는 전용 디렉터리 | 호스트 OS의 임의 경로 |
| 관리 방식 | 이름으로 관리 (도커가 관리) | 호스트 경로를 직접 지정 |
| 주 용도 | 컨테이너 간 파일 시스템 공유·데이터 지속화 | 호스트 ↔ 컨테이너 간 파일 공유 |
| 제약 | 적음 (권장) | 많음 |
4.8. 네임스페이스
4.8.1. 네임스페이스란
- 네임스페이스(Namespace): 리소스의 덮개와 같은 역할로, 내부의 프로세스가 외부 프로세스로부터 격리된 것처럼 보이게 하는 구조
- 네임스페이스의 역할은 내부에서 외부를 볼 수 없게 하는 것뿐임 → 공간이라기보다 필터에 가까움
- 한마디로 나타내면 "보이지 않는다면 없는 것과 같다"
4.8.2. 네임스페이스와 컨테이너
도커는 네임스페이스를 이용해 다른 컨테이너와 격리함.
- 네임스페이스의 실체는 특별한 플래그를 지정해 실행한 프로세스이며, 이 프로세스의 자식 프로세스가 네임스페이스의 멤버가 됨
- 컨테이너 실행 시 도커 데몬의 절차:
- 컨테이너 전용 네임스페이스가 되는 최초 프로세스를 생성
- 그 네임스페이스의 멤버로서 컨테이너에 포함된 프로세스를 실행
- 이 절차는 컨테이너를 실행할 때마다 수행되며, 각 컨테이너에 전용 네임스페이스가 만들어지므로 컨테이너는 서로 격리됨
네임스페이스에 의한 컨테이너 격리:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[도커 데몬]
│ 컨테이너를 실행할 때마다
▼
┌───────────────────────────────┐ ┌────────────────┐
│ 네임스페이스 A (컨테이너 A) │ │ 네임스페이스 B │
│ ┌────────┐ ┌────────┐ │ │ (컨테이너 B) │
│ │ 최초 │→ │ 자식 │ ... │ │ ┌────────┐ │
│ │ 프로세스│ │ 프로세스│ │ │ │ ... │ │
│ └────────┘ └────────┘ │ │ └────────┘ │
│ → 내부에서 외부가 보이지 않음 │ └────────────────┘
└───────────────────────────────┘
"보이지 않는다면 없는 것과 같다" — 필터 역할
4.8.3. 네임스페이스에 의해 격리된 리소스
네임스페이스는 다양한 리소스를 격리할 수 있음. 예를 들어 PID 네임스페이스는 프로세스 ID를 격리해 다른 컨테이너에서 동일한 프로세스 ID를 사용할 수 있게 하고, 네트워크 네임스페이스는 네트워크 인터페이스와 포트 번호를 격리해 컨테이너마다 다른 IP 주소를 할당할 수 있게 함.
| 네임스페이스 | 격리하는 리소스 |
|---|---|
| PID 네임스페이스 | 프로세스 ID |
| 네트워크 네임스페이스 | 네트워크 인터페이스, 포트 번호 |
| IPC 네임스페이스 | 프로세스 간 통신 |
| 마운트 네임스페이스 | 파일 시스템 |
| UTS 네임스페이스 | 호스트명 |
4.8.4. 컨트롤 그룹이란
- 네임스페이스로는 리소스를 격리할 수 있지만, 컨테이너가 사용할 수 있는 CPU 코어 수·메모리 용량·디스크 I/O 같은 하드웨어 리소스 사용량을 제한할 수는 없음
- 컨트롤 그룹(cgroups): 하드웨어 리소스 사용량에 상한선을 설정하는 방식
- 특정 컨테이너가 시스템 리소스를 소모해 다른 컨테이너에 영향을 미치는 상황을 방지
- 표기 구분:
- 단수형 cgroup: 제한 대상이 되는 프로세스의 집합
- 복수형 cgroups: ① 하드웨어 리소스 사용량을 제한하는 방식 또는 ② 여러 개의 cgroup → 문맥으로 판단
- 네임스페이스 (Namespace): 리소스를 "보이지 않게" 하여 프로세스를 격리하는 리눅스 커널 기능
- 컨트롤 그룹 (cgroups): 프로세스 집합이 사용하는 하드웨어 리소스(CPU·메모리·디스크 I/O 등) 사용량을 제한하는 리눅스 커널 기능
4.8.5. 컨트롤 그룹의 계층 구조
- 컨트롤 그룹은 파일 시스템의 디렉터리와 마찬가지로 계층 구조임
- 설정을 변경하려면 cgroupfs라는 파일 시스템과 비슷한 인터페이스를 사용함
- 상위 cgroup의 설정은 하위 cgroup으로 상속되며, 하위 cgroup은 상위 cgroup이 설정한 제한을 초과할 수 없음
격리(네임스페이스) vs 제한(컨트롤 그룹):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[네임스페이스] — "보이지 않게" [컨트롤 그룹(cgroups)] — "얼마나 쓸지"
├─ PID (프로세스 ID) ├─ CPU 코어 수
├─ 네트워크 (인터페이스·포트) ├─ 메모리 용량
├─ IPC (프로세스 간 통신) └─ 디스크 I/O
├─ 마운트 (파일 시스템)
└─ UTS (호스트명) 계층 구조 (cgroupfs)
└─ 상위 제한을 하위가 상속 · 초과 불가
4.9. 차분 관리
4.9.1. 차분 관리란
- 차분 관리: 기준을 정하고 그 기준과의 차이점만 기록해 변경 사항을 관리하는 방법
- 도커는 컨테이너 이미지에 포함된 파일 시스템에 차분 관리 방식을 사용함
- 비유: 인쇄가 끝난 문서에서 오탈자를 발견했을 때, 전부 다시 인쇄하는 대신 수정한 부분과 그 내용만 정오표로 첨부해 독자가 참고하게 만드는 것
4.9.2. 이미지 레이어의 특징
- 컨테이너 이미지의 파일 시스템은 여러 레이어로 구성되며, 각 레이어에는 직전 레이어와의 차분만 기록함
- 레이어가 있더라도 직전 레이어의 변경 사항이 없으면 데이터가 없을 수 있음
- 직전 레이어의 변경을 무시하고 두 레이어 전으로 되돌리는 작업을 하더라도, 변경 사항은 새 레이어 하나에 기록됨
- 컨테이너 이미지에 포함된 레이어를 **이미지 레이어(Image Layer)라고 하며, 컨테이너 레이어와 구별해 사용함
- 이미지 레이어는 읽기 전용이며, 새 파일을 추가하거나 기존 파일을 변경할 수 없음
4.9.3. 컨테이너 레이어의 특징
- 컨테이너를 실행하면 이미지 레이어 위에, 프로세스에 따른 파일 추가·변경 사항을 기록하는 **컨테이너 레이어(Container Layer)가 생성됨 → 기록(쓰기) 가능하다는 점이 이미지 레이어와 다름
- 파일 쓰기: 컨테이너 프로세스가 이미지 레이어의 파일을 수정하려고 하면
- 대상 파일을 이미지 레이어 → 컨테이너 레이어로 복사
- 복사된 파일을 변경
→ 이 방법을 카피 온 라이트(Copy-on-Write) 전략이라 하며, 도커의 파일 읽기·쓰기 속도를 빠르게 함
- 파일 읽기: 컨테이너 레이어를 포함한 모든 레이어에서 대상 파일을 검색하고, 그중 가장 새로운 것을 읽어 들임
- 컨테이너 레이어는 컨테이너와 라이프 사이클이 동일함 → 컨테이너를 삭제하면 시작할 때 생성된 컨테이너 레이어도 함께 삭제됨
이미지 레이어와 컨테이너 레이어:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┌──────────────────────────────┐
│ 컨테이너 레이어 (쓰기 가능) │ ← 컨테이너와 함께 생성·삭제
├──────────────────────────────┤
│ 이미지 레이어 3 (읽기 전용) │ ┐
├──────────────────────────────┤ │ 각 레이어는 직전 레이어와의
│ 이미지 레이어 2 (읽기 전용) │ │ '차분'만 기록
├──────────────────────────────┤ │
│ 베이스 이미지 레이어 (읽기전용)│ ┘
└──────────────────────────────┘
[파일 쓰기 — 카피 온 라이트(Copy-on-Write)]
이미지 레이어의 파일 수정 요청
→ 파일을 컨테이너 레이어로 복사한 뒤, 복사본을 변경
[파일 읽기]
모든 레이어에서 대상 파일을 검색 → 가장 새로운 버전을 읽음
| 구분 | 이미지 레이어 (Image Layer) | 컨테이너 레이어 (Container Layer) |
|---|---|---|
| 쓰기 가능 여부 | 읽기 전용 (변경 불가) | 쓰기 가능 |
| 생성 시점 | 이미지 빌드 시 | 컨테이너 실행 시 |
| 라이프 사이클 | 이미지에 귀속, 재사용됨 | 컨테이너와 동일 (삭제 시 함께 삭제) |
| 기록 내용 | 직전 레이어와의 차분 | 프로세스가 추가·변경한 파일 |
4.9.4. 차분 관리의 장단점
장점
- 컨테이너를 시작할 때마다 이미지의 모든 파일을 컨테이너 레이어로 복사할 필요가 없음 → 도커는 빠른 배포를 제공
- 파일 추가·변경 시 변경 사항만 기록하므로 데이터 용량도 줄일 수 있음
단점
- 카피 온 라이트 전략으로 파일을 변경하면 파일이 복사되므로, 파일 쓰기가 많은 응용 프로그램은 성능이 크게 저하될 수 있음
- 대응: 도커 볼륨을 사용해 컨테이너 레이어에 기록하는 양을 줄이면 성능 저하를 방지할 수 있음
4.10. 스웜 모드
4.10.1. 스웜 모드란
- 스웜 모드(Swarm Mode): 도커 엔진에 내장된 클러스터 관리 기능 (클러스터 관리 = 여러 서버를 일괄 관리하는 것)
- 도커 엔진에는 스웜 모드 활성화 / 비활성화의 두 가지 작동 모드가 있음
- 스웜 모드가 활성화된 도커 엔진을 도커 호스트라고 함
- 스웜(Swarm) = 여러 도커 호스트로 구성된 클러스터 집합체 (스웜 = 무리, 군중)
- 스웜에서는 도커 호스트를 **노드(Node)**라고 부르기도 함
4.10.2. 매니저와 워커
도커는 스웜 내 노드에 매니저 / 워커 / 매니저 겸 워커 세 역할 중 하나를 부여함.
- 매니저(Manager): 워커를 관리하고 스웜을 정상 상태로 유지하며, 스웜에 대한 요청을 수락하는 창구인 엔드포인트를 제공
- 워커(Worker): 매니저의 지시에 따라 컨테이너를 실행. 워커 수가 많을수록 스웜에서 실행할 수 있는 컨테이너 수가 늘어남
- 스웜은 여러 매니저를 가질 수 있음 → 일부 매니저에 장애가 발생해도 다른 매니저가 워커 관리를 인계받아 전체 스웜이 다운되는 상황을 방지
스웜 모드의 구조:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
사용자 ──서비스 정의──▶ ┌───────────────────┐
(이미지·복제 수 등) │ 매니저 (엔드포인트) │ ◀─ 여러 매니저로 이중화
└─────────┬─────────┘
컨테이너 실행 계획·지시
┌────────────────┼────────────────┐
▼ ▼ ▼
┌────────┐ ┌────────┐ ┌────────┐
│ 워커 1 │ │ 워커 2 │ │ 워커 3 │
│ [태스크]│ │ [태스크]│ │ [태스크]│ ← 태스크 = 워커의 컨테이너
└────────┘ └────────┘ └────────┘
스웜(Swarm) = 도커 호스트(노드)들의 클러스터
4.10.3. 서비스와 태스크
- 서비스(Service): 스웜을 정상 상태로 유지하기 위한 정의. 스웜에서 실행되는 컨테이너 이미지, 컨테이너 내에서 실행되는 명령, 복제할 컨테이너 수 등 다양한 지침을 정의함
- 흐름:
- 사용자가 스웜에서 컨테이너를 실행할 때 매니저에 서비스를 제출
- 매니저가 서비스 정의를 기반으로 컨테이너를 실행할 워커를 계획하고, 워커에게 컨테이너 실행을 지시
- 워커에서 실행되는 컨테이너를 **태스크(Task)라고 하며, 서비스를 관리하기 위한 최소 단위임
4.10.4. 클러스터를 관리하는 도구
- 도커 엔진의 표준인 스웜 모드는 도커의 클러스터 관리·오케스트레이션을 주로 담당했음
- 그러나 도커가 스웜 모드와 동등한 기능을 가진 컨테이너 오케스트레이션 도구 **쿠버네티스(Kubernetes)**를 공식적으로 지원하면서 방향성이 바뀌었음
4.11. 도커의 주요 명령어
4.11.1. 도커 명령어를 사용할 수 있는 환경
- 리눅스 (CentOS, Ubuntu 등):
yum,apt같은 패키지 관리 시스템으로 도커를 설치 - 윈도우 / 맥OS: 버추얼박스 등 가상화 소프트웨어로 구축한 가상 머신 상의 리눅스에 설치할 수도 있으나, 윈도우·맥OS용 도커 데스크톱(Docker Desktop) 설치가 권장됨
- 도커 명령어는 명령줄 작업으로 실행됨 → 리눅스·맥OS는 터미널, 윈도우는 명령 프롬프트·파워셸을 사용
- 예:
docker info
- 예:
4.11.2. 도커 명령어의 기본
docker로 시작해 그 뒤에info,version같은 명령어가 붙음container,image같은 명령어는 관리 명령어라고 하며, 그 뒤에 하위 명령어가 계속 이어짐- 옵션 형식: 하이픈 1개 + 영문 1글자, 또는 하이픈 2개 + 영어 단어
-h/--help: 사용법을 표시할 때 자주 쓰임
도커 명령어의 구조:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
docker container run -i -t centos:latest /bin/bash
│ │ │ │ │ │
기본 관리 명령어 옵션 이미지 컨테이너 내
명령 명령어 실행 명령
옵션: -i (하이픈 1개 + 영문 1글자) / --help (하이픈 2개 + 영어 단어)
4.11.3. 컨테이너의 시작 / 분리 / 표시 / 정지 / 삭제
| 작업 | 명령어 / 조작 | 비고 |
|---|---|---|
| 시작 | docker container run |
-i 키보드 입력 활성화, -t 셸 프롬프트 표시 활성화 |
| 분리 (detach) | Ctrl + P → Ctrl + Q |
시작한 컨테이너에서 빠져나오는 조작 |
| 상태 확인 | docker container ls |
컨테이너 ID, 이미지 등 확인 |
| 정지 | docker container kill |
실행 중인 컨테이너 정지 |
| 정지 포함 전체 표시 | docker container ls -a |
-a = 정지한 모든 컨테이너 표시 |
| 삭제 | docker container rm |
남아 있는 컨테이너 레이어 삭제 |
~$ docker container run -i -t centos:latest /bin/bash
컨테이너를 정지한 후에도 컨테이너 레이어는 남아 있음. docker container ls -a로 확인하고 docker container rm으로 삭제함.
4.11.4. 컨테이너 이미지의 생성 / 표시 / 삭제
| 작업 | 명령어 | 비고 |
|---|---|---|
| 생성 | docker container commit |
실행 중인 컨테이너로부터 이미지 생성 |
| 표시 | docker image ls |
리포지터리, 태그, 이미지 ID 등 확인 |
| 삭제 | docker image rm |
4.11.5. 도커 파일로 컨테이너 이미지 생성
- 도커 파일(Dockerfile): 컨테이너 이미지를 만드는 데 필요한 명령어를 모아 둔 텍스트 파일. 도커가 도커 파일에 작성된 매뉴얼을 실행해 자동으로 컨테이너 이미지를 만듦
| 명령어 | 설명 |
|---|---|
| FROM | 기본(베이스) 컨테이너 이미지를 지정 |
| WORKDIR | 컨테이너의 작업 폴더를 지정 |
| COPY | 파일 및 디렉터리를 컨테이너에 복사 |
| RUN | 컨테이너에서 명령을 실행 |
| EXPOSE | 컨테이너가 외부에 공개하는 포트를 선언 |
| CMD | 기본 시작 명령을 지정 |
4.11.6. 도커 명령어를 사용하는 곳
- 소프트웨어를 설치할 필요 없이 다양하게 실행할 수 있어 편리함
- 예: nginx 웹 서버 실행
~$ docker container run -v $PWD:/usr/share/nginx/html:ro -d -p 8080:80 nginx-v: 로컬 지정 폴더에 컨테이너가 접근할 수 있게 하는 옵션 (:ro= 읽기 전용)-d: 컨테이너를 연결(attach)하지 않고 백그라운드로 시작하는 옵션-p: 로컬 포트에 컨테이너 포트를 할당하는 옵션 (위 예: 로컬8080/TCP→ 컨테이너80/TCP)
- 그 밖에 맥OS의
gcc(C 언어 컴파일러)에서-m32를 활성화해 C 프로그램을 컴파일할 수 없을 때 등도 도커 파일로 해결할 수 있음
4.12. 도커 허브: 컨테이너 이미지를 공유할 수 있는 서비스
4.12.1. 도커 허브란
- 도커 허브(Docker Hub): 도커 사가 제공하는 세계 최대의 컨테이너 레지스트리 서비스
- 다양한 소프트웨어의 컨테이너 이미지가 등록되어 있어, 사용자는 검색하고 실행하는 것만으로 소프트웨어를 사용할 수 있음
- 리포지터리(Repository): 도커 허브에서 만드는 컨테이너 이미지 저장소
- 공개 / 비공개 리포지터리를 모두 만들 수 있으며, 비공개는 소유자만 접근 가능
- 생성할 수 있는 비공개 리포지터리의 수는 월 사용료 등에 따라 다름
4.12.2. 컨테이너 레지스트리란
- 컨테이너 레지스트리(Container Registry): 컨테이너 이미지를 저장하고 배포하는 두 역할을 담당하는 도커의 구성 요소
- 실체는 레지스트리 서버에서 실행되는 응용 프로그램
- Docker Registry HTTP API라는 프로토콜로 통신해 이미지를 업로드·다운로드함
- 푸시(Push): 레지스트리에 컨테이너 이미지를 업로드
- 풀(Pull): 레지스트리에서 컨테이너 이미지를 내려받음
- 컨테이너 레지스트리 소프트웨어 자체도
registry라는 이름으로 도커 허브에 등록되어 있어, 이를 가져와 실행하면 자신만의 컨테이너 레지스트리를 운영할 수도 있음
컨테이너 레지스트리의 계층과 푸시 / 풀:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┌────────────────────────────────────────────┐
│ 컨테이너 레지스트리 (도커 허브 등) │
│ ┌──────────────────┐ ┌─────────────────┐ │
│ │ 리포지터리: nginx │ │ 리포지터리: ... │ │
│ │ ├─ 이미지 :latest │ │ │ │
│ │ ├─ 이미지 :1.25 │ │ (같은 이미지의 │ │
│ │ └─ 이미지 :stable │ │ 버전들을 태그로) │ │
│ └──────────────────┘ └─────────────────┘ │
└──────────────────▲──────────────────┬───────┘
Push(업로드) │ │ Pull(다운로드)
│ ▼
┌──────────────────────┐
│ 도커 호스트 / 개발자 │
└──────────────────────┘
4.12.3. 리포지터리와 태그
- 계층 관계: 컨테이너 레지스트리 > 여러 리포지터리 > 여러 컨테이너 이미지
- 하나의 리포지터리에는 관계없는 이미지를 넣지 않으며, 일반적으로 동일한 컨테이너 이미지의 서로 다른 버전을 담음
- 태그(Tag): 리포지터리가 컨테이너 이미지에 붙이는 라벨.
latest,stable등 의미 있는 단어로 지정
4.12.4. 도커 허브 이외의 컨테이너 레지스트리 서비스
| 클라우드 | 서비스명 |
|---|---|
| AWS | Amazon ECR (Elastic Container Registry) |
| GCP | Container Registry |
| Azure | Azure Container Registry (ACR) |
- 도커 허브와는 다른 요금 체계로 비공개 저장소를 만들 수 있음
- 컨테이너 레지스트리로서의 기본 기능은 공통이지만, 각 클라우드에서 제공하는 다른 서비스와 연계하기 쉬운 점이 특징
핵심 요약
4-2장. 도커 심화: 격리 기술 · 레이어 · 클러스터 · 명령어 요약:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[컨테이너와 프로세스]
├─ 원칙: 1 컨테이너 = 1 프로세스 ("같은 프로세스로 볼 수 있는가"로 판단)
├─ 장점: 병목만 개별 확장 · 오버헤드 거의 없음 · 경합 상태 방지
└─ 단점: 관리 복잡(→ 오케스트레이션) · 리소스 공유 전제 SW는 부적합
[데이터 지속화]
├─ 볼륨: 도커가 관리하는 이름 붙은 디렉터리 · 여러 컨테이너에 동시 마운트
└─ 바인드 마운트: 호스트 경로를 마운트 · 주로 호스트 ↔ 컨테이너 공유
[격리 기술]
├─ 네임스페이스: 리소스를 '보이지 않게' 격리 (PID · 네트워크 · IPC · 마운트 · UTS)
└─ 컨트롤 그룹(cgroups): 하드웨어 사용량 '제한' (CPU · 메모리 · 디스크 I/O) · 계층 상속
[차분 관리]
├─ 이미지 레이어: 읽기 전용 · 직전 레이어와의 차분만 기록
├─ 컨테이너 레이어: 쓰기 가능 · 컨테이너와 라이프 사이클 동일
├─ 카피 온 라이트: 수정 시 파일을 컨테이너 레이어로 복사한 뒤 변경
└─ 장점(빠른 배포 · 용량 절감) ↔ 단점(잦은 쓰기 시 성능 저하 → 볼륨으로 완화)
[스웜 모드]
├─ 도커 엔진 내장 클러스터 관리 (스웜 = 도커 호스트/노드들의 클러스터)
├─ 역할: 매니저(관리 · 엔드포인트) / 워커(컨테이너 실행)
├─ 서비스(원하는 상태 정의) → 태스크(워커의 컨테이너, 최소 단위)
└─ 현재는 쿠버네티스를 공식 지원하며 방향 전환
[주요 명령어]
├─ 컨테이너: run(-i -t) / ls(-a) / kill / rm , 분리 = Ctrl+P → Ctrl+Q
├─ 이미지: container commit / image ls / image rm
├─ Dockerfile: FROM · WORKDIR · COPY · RUN · EXPOSE · CMD
└─ 예: run -v(마운트) -d(백그라운드) -p(포트 할당)
[도커 허브 / 레지스트리]
├─ 레지스트리 > 리포지터리 > 이미지 (태그: latest · stable …)
├─ 푸시(업로드) / 풀(다운로드) — Docker Registry HTTP API
└─ 그 외: Amazon ECR · GCP Container Registry · Azure ACR
참고 자료
관련 자료:
- Docker 볼륨: https://docs.docker.com/storage/volumes/
- Docker 스토리지 (볼륨 vs 바인드 마운트): https://docs.docker.com/storage/
- Linux namespaces(네임스페이스) 매뉴얼: https://man7.org/linux/man-pages/man7/namespaces.7.html
- Linux control groups(cgroups) 매뉴얼: https://man7.org/linux/man-pages/man7/cgroups.7.html
- Docker 스토리지 드라이버와 레이어(Copy-on-Write): https://docs.docker.com/storage/storagedriver/
- Docker Swarm 모드: https://docs.docker.com/engine/swarm/
- Dockerfile 레퍼런스: https://docs.docker.com/reference/dockerfile/
- Docker CLI 레퍼런스: https://docs.docker.com/reference/cli/docker/
- Docker Hub: https://hub.docker.com/
- Amazon ECR: https://aws.amazon.com/ecr/